package chapter08

/**
  *
  * @author Pop
  * @date 2022/7/4 22:41
  */
object Test02_MatchTypes {

  def main(args: Array[String]): Unit = {
    // 1.匹配常量
    def describeConst(x:Any):String = x match {
      case 1 => "Num one"
      case "hello" => "String hello"
      case true => "Boolean"
      case _ => ""
    }

    // 2.匹配类型
    def describeType(x:Any):String = x match {
      case i:Int => "Int" +i
      case s:String => "String"
        // 要使用泛型的时候需要注意，会存在泛型擦除
      case list:List[String] =>"list"
      case array:Array[Int] => "Array"
        // 不一定是 _ ，这个只是一个占位符，如果你希望获取到参数，可以随便定一个变量接受
      case a => ""
    }

    // 3.匹配数组
    for(arr <- List(
      Array(0),
      Array(1,0),
      Array(0,1,0),
      Array(1,1,0),
      Array("hello",1,30)
    )){
      /**
        * 强大的模式匹配，可以允许匹配数组中的元素个数，和类型
        */
      val result = arr match {

        case Array(0) => "0"
        case Array(1,0) => "Array(1,0)"
          // 允许接受两个元素的数组，且用x 与 y变量接受
        case Array(x,y) => "Array: "+x+" "+y
        case Array(0,_*) => "以0开头的数组，后面运行若干元素"
        case Array(x,1,z) => "中间为1的三元数组"
      }


      // 匹配列表
      // 方式1
      for(list <- List(
        List(0),
        List(1,0),
        List(88)
      )){

        val str: String = list match {
          case List(0) => "0"
          case List(x, y) => "list(x,y"
          case List(0, _*) => "s"
          case _ => "something else"
        }

      }

      // 方式2
      val ints = List(1, 2, 3, 4, 5)
      ints match {
        // 标识，list列表至少有3个元素，first是第一个元素
        // second是第二个元素，reset表示剩下的所有元素
        case first :: second :: rest => println(s"$first")
        case _ => println("something else")
      }

      // 匹配元组
      for(tuple <- List(
        (0,1),
        (0,0),
        (0,1,1),
          ("hello",true,0.5)
      )){
        tuple match {
          case (a,b) =>"一个二元组，参数ab接收"
          case (0,_) =>"一个以0开头的二元组，第二任意"
          case (a,1,_) => "三元组，第二个一定是1，第三个任意"
        }
      }

    }
  }

}
